package com.sunyifeng.ch11.v1;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * 11.2.1 Future接口实现异步
 */
public class ShopMain {

  public static void main(String[] args) {
    Shop shop = new Shop("BestShop");
    long start = System.nanoTime();
    // CompletableFuture实现异步
    Future<Double> futurePrice = shop.getPriceAsync("my favorite product");
    long invocationTime = ((System.nanoTime() - start) / 1_000_000);
    System.out.println("异步调用在几毫秒就返回了：" + invocationTime + " msecs");
    // 调用阻塞服务时做其他的事情
    doSomethingElse();
    try {
        // 如果阻塞服务执行完成（获得商品价格）
        double price = futurePrice.get();
        System.out.printf("获取商品的价格是： %.2f%n", price);
    } catch (ExecutionException | InterruptedException e) {
        throw new RuntimeException(e);
    }
    long retrievalTime = ((System.nanoTime() - start) / 1_000_000);
    System.out.println("多少毫秒阻塞服务执行完成（获取到价格）：" + retrievalTime + " msecs");
  }

  // 调用阻塞服务时做其他的事情
  private static void doSomethingElse() {
      System.out.println("调用阻塞服务时做其他的事情...");
  }

}
